import dayjs from 'dayjs'

/**
 * 格式化日期
 * @param date 日期字符串或Date对象
 * @param format 格式化模板，默认为 'YYYY-MM-DD HH:mm:ss'
 * @returns 格式化后的日期字符串
 */
export const formatDate = (date: string | Date, format = 'YYYY-MM-DD HH:mm:ss'): string => {
  if (!date) return '-'
  return dayjs(date).format(format)
}

/**
 * 格式化日期时间
 * @param date 日期字符串或Date对象
 * @param format 格式化模板，默认为 'YYYY-MM-DD HH:mm:ss'
 * @returns 格式化后的日期时间字符串
 */
export const formatDateTime = (date: string | Date, format = 'YYYY-MM-DD HH:mm:ss'): string => {
  if (!date) return '-'
  return dayjs(date).format(format)
}

/**
 * 格式化文件大小
 * @param bytes 字节数
 * @returns 格式化后的文件大小字符串
 */
export const formatFileSize = (bytes: number): string => {
  if (bytes === 0) return '0 B'
  
  const k = 1024
  const sizes = ['B', 'KB', 'MB', 'GB', 'TB']
  const i = Math.floor(Math.log(bytes) / Math.log(k))
  
  return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]
}

/**
 * 格式化数字
 * @param num 数字
 * @param digits 小数位数，默认为2
 * @returns 格式化后的数字字符串
 */
export const formatNumber = (num: number, digits = 2): string => {
  if (num === null || num === undefined) return '-'
  return Number(num).toFixed(digits)
}

/**
 * 格式化百分比
 * @param num 数字
 * @param digits 小数位数，默认为2
 * @returns 格式化后的百分比字符串
 */
export const formatPercent = (num: number, digits = 2): string => {
  if (num === null || num === undefined) return '-'
  return Number(num).toFixed(digits) + '%'
}

/**
 * 格式化手机号
 * @param phone 手机号
 * @returns 格式化后的手机号字符串
 */
export const formatPhone = (phone: string): string => {
  if (!phone) return '-'
  return phone.replace(/(\d{3})(\d{4})(\d{4})/, '$1-$2-$3')
}

/**
 * 格式化身份证号
 * @param idCard 身份证号
 * @returns 格式化后的身份证号字符串
 */
export const formatIdCard = (idCard: string): string => {
  if (!idCard) return '-'
  return idCard.replace(/(\d{6})(\d{4})(\d{4})(\w{4})/, '$1-$2-$3-$4')
}

/**
 * 格式化银行卡号
 * @param cardNo 银行卡号
 * @returns 格式化后的银行卡号字符串
 */
export const formatBankCard = (cardNo: string): string => {
  if (!cardNo) return '-'
  return cardNo.replace(/(\d{4})(?=\d)/g, '$1 ')
}

/**
 * 格式化金额
 * @param amount 金额
 * @param currency 货币符号，默认为 '¥'
 * @param digits 小数位数，默认为2
 * @returns 格式化后的金额字符串
 */
export const formatMoney = (amount: number, currency = '¥', digits = 2): string => {
  if (amount === null || amount === undefined) return '-'
  return currency + Number(amount).toFixed(digits)
}

/**
 * 格式化持续时间
 * @param seconds 秒数
 * @returns 格式化后的持续时间字符串
 */
export const formatDuration = (seconds: number): string => {
  if (seconds < 60) {
    return `${seconds}秒`
  } else if (seconds < 3600) {
    const minutes = Math.floor(seconds / 60)
    const remainingSeconds = seconds % 60
    return `${minutes}分${remainingSeconds}秒`
  } else if (seconds < 86400) {
    const hours = Math.floor(seconds / 3600)
    const minutes = Math.floor((seconds % 3600) / 60)
    return `${hours}小时${minutes}分`
  } else {
    const days = Math.floor(seconds / 86400)
    const hours = Math.floor((seconds % 86400) / 3600)
    return `${days}天${hours}小时`
  }
} 